כשיש הרבה רשומות במסד וצריך להציג אותם למשתמש שווה לפרק את הפלט לכמה עמודים. וגם לשלוף הכל לא צריך. אפשר לשלוף רק את מה שהמשתמש הולך לראות.
הצגת נתונים מרובים בעמוד אחד מכבידה על גודל העמוד, קלות ההתמצאות בו ונוחות השימוש בו. גם השרת שלכם סובל מעבודה עם כמות נתונים גדולה שאין בהם כל צורך, לכן רצוי להפריד נתונים כאלה לעמודים נפרדים.
כל התהליך מסתכם בהכרת הפקודה LIMIT של MySQL שעושה את כל הקסם. בפוסט הזה נראה איך היא עובדת ומה אפשר לעשות איתה. אם הפקודה SELECT .. FROM .. LIMIT X,Y עדיין לא מוכרת לכם, המשיכו בקריאה
לצורך ההדגמה נעבוד עם טבלה שתראה כך: (קוד sql)
בטבלה 19 שורות שנחלק אותם ל5 שורות בעמוד.
הפקודה LIMIT
מטרתה של המילה הזו היא לומר למסד כמה שורות אנחנו רוצים לשלוף. לדוגמה השאילתה
SELECT * FROM `test` WHERE `id` > 5 LIMIT 3
אומרת למסד להחזיר רק את שלוש השורות הראשונות שעונות לתנאי, למרות שבטבלה יש הרבה יותר שורות עם id שגדול מחמש. במילים אחרות LIMIT מגבילה את כמות השורות שהמסד יחזיר לשאילתה שלנו.
LIMIT מורחב
LIMIT יודעת לא רק להחזיר כמות מסוימת של שורות, אלה גם להתחיל משורה כלשהי, אם נותנים לה שני פרמטרים (שני מספרים).
LIMIT 3, 7
המספר הראשון מסמן החל מאיזה שורה להתחיל (על כמה שורות לדלג)
המספר השני מסמן את כמות השורות שיש להחזיר (בדיוק כמו לפני-כן)
SELECT * FROM `test` WHERE `id` > 5 LIMIT 3,7
השאילתה הזו תחילה מבצעת את התנאי הרשום בwhere- ומחפשת את כל השורות שעונות לו. לצורך העניין יש 14 שורות שעונות לתנאי. לאחר מכן limit הולכת אל השורה הרבעיתי (המיספור מתחיל מאפס) מתוך אותם 14 שהתאימו ומחזירה את השבע הראשונות.
אחרי שהתנאי התבצע limit מתחילה לפעול על תוצאות השליפה. היא מדלגת על שלוש שורות ראשונות מתוך התוצאה והחל מהשורה הרביעית מתחילה לספור שבע שורות שמוחזרות כתוצאת השאילתה.
קצת php
ניצור סקריפט עם השם index.php שיקבל משורת הכתובת את העמוד הנוכחי שבו אנחנו נמצאים. index.php?page=2 למשל.
בקוד שלנו יהיה עלינו לקבל את הערך של מספר העמוד ולחשב כמה שורות יהיה עלינו לדלג בתוצאת השליפה שלנו. אנחנו רוצים להציג 5 רשומות בעמוד. כלומר
בעמוד הראשון נציג 5 שורות החל מהשורה האפסית (נדלג על אפס שורות)
בעמוד השני נציג 5 שורות החל מהשורה החמישית (נדלג על חמש השורות הראשונות)
בעמוד השלישי נציג חמש שורות החל מהשורה העשירית (נדלג על 10 שורות)
השאילה שלנו תראה בצורה הזו
SELECT * FROM `test` LIMIT $start_from, $per_page
start_from היא כמות השורות ש-limit צריכה לדלג עליהם
per_page היא כמות השורות שסה"כ אנחנו רוצים למשוך מהמסד בשאילתה הזו ונשארת קבוע בכל עמוד.
כמות השורות שעלינו לדלג היא
(מספר העמוד פחות אחד) כפול מספר השורות בעמוד.
בעמוד אחד יהיה עלינו לדלג על 5x0 שורות
בעמוד שתיים יהיה עלינו לדלג על 5x1 שורות
בעמוד שלוש יהיה עלינו לדלג על 5x2 שורות
<?php
$per_page = 5;
$page = 1;
if (isset($_GET['page']))
{
$page = intval($_GET['page']);
if($page < 1) $page = 1;
}
$start_from = ($page - 1) * $per_page;
mysql_connect(..);
mysql_select_db(..);
$current_items = mysql_query( "SELECT * FROM `test` LIMIT $start_from, $per_page");
if( mysql_num_rows($current_items) > 0)
{
while($item = mysql_fetch_assoc($current_items))
{
echo $item['text'], '<br/>';
}
}
else
{
echo 'this page does not exists';
}
$per_page = 5;
$page = 1;
if (isset($_GET['page']))
{
$page = intval($_GET['page']);
if($page < 1) $page = 1;
}
$start_from = ($page - 1) * $per_page;
mysql_connect(..);
mysql_select_db(..);
$current_items = mysql_query( "SELECT * FROM `test` LIMIT $start_from, $per_page");
if( mysql_num_rows($current_items) > 0)
{
while($item = mysql_fetch_assoc($current_items))
{
echo $item['text'], '<br/>';
}
}
else
{
echo 'this page does not exists';
}
תחילה נגדיר את כמות הרשומות שיש להציג בכל עמוד במשתנה per_page
לאחר מכן נקרא את תוכן המשתנה ?page במידה ויש כזה.
הפונקציה isset בודקת האם משתנה הזה מוגדר. אם כן - נהפוך אותו למספר שלם. אם לא, ישאר בו הערך 1. אם מישהו יכתוב במשתנה ?page משהו לא מספרי index.php?page=hello הפונקציה intval תנסה להפוך את זה למספר ותחזיר את המספר אפס. אפס הוא מספר עמוד לא חוקי, כי המספור מתחיל מאחד.
נחשב את כמות השורות שיש לדלג עליהם בשליפה ונריץ את השאילתה.
נסו לגלוש גם ל index.php?page=3 ותגלו שהשורות החל מהשורה ה-15 נבחרו.
הצגת מיספור העמודים
על מנת להציג קישורים לעמודים אחרים נצתרך לדעת כמה סה"כ שורות יש לנו במסד. את המידע הזה נשלוף באמצעות שאילתה נוספת.
SELECT COUNT(*) FROM `test`
השאילתה הזו תחזיר מספר אחד בלבד — כמות השורות שיש בטבלה.
נוכל להשתמש במידע זה כדי להציג קישורים לעמודים אחרים.
שימו לב, שהשאילתה הזו צריכה להחזיר את כמות השורות שעונות לתנאי של השאילתה המקורית שלנו. אם בשאילתה המקורית השתמשתם בתנאי כלשהו, לדוגמה, age > 10, אזי יש להשתמש בתנאי זהה גם בשאילתה הזו.
לאחר מכן נחלק את כמות השורות שיש במסד בכמות השורות שאנחנו מציגים בכל עמוד ונקבל את מספר העמודים הכולל שעלינו להציג.
<?php
$per_page = 5;
$page = 1;
if (isset($_GET['page']))
{
$page = intval($_GET['page']);
if($page < 1) $page = 1;
}
$start_from = ($page - 1) * $per_page;
mysql_connect(..);
mysql_select_db(..);
$current_items = mysql_query( "SELECT * FROM `test` LIMIT $start_from, $per_page");
if( mysql_num_rows($current_items) > 0)
{
while($item = mysql_fetch_assoc($current_items))
{
echo $item['text'], '<br/>';
}
}
else
{
echo 'this page does not exists';
}
$total_rows = mysql_query("SELECT COUNT(*) FROM `test`");
$total_rows = mysql_fetch_row($total_rows);
$total_rows = $total_rows[0];
$total_pages = $total_rows / $per_page;
$total_pages = ceil($total_pages); # 19/5 = 3.8 ~=~ 4
for($i = 1; $i <= $total_pages; ++$i)
{
echo "<a href='?page=$i'>$i</a> ";
}
$per_page = 5;
$page = 1;
if (isset($_GET['page']))
{
$page = intval($_GET['page']);
if($page < 1) $page = 1;
}
$start_from = ($page - 1) * $per_page;
mysql_connect(..);
mysql_select_db(..);
$current_items = mysql_query( "SELECT * FROM `test` LIMIT $start_from, $per_page");
if( mysql_num_rows($current_items) > 0)
{
while($item = mysql_fetch_assoc($current_items))
{
echo $item['text'], '<br/>';
}
}
else
{
echo 'this page does not exists';
}
$total_rows = mysql_query("SELECT COUNT(*) FROM `test`");
$total_rows = mysql_fetch_row($total_rows);
$total_rows = $total_rows[0];
$total_pages = $total_rows / $per_page;
$total_pages = ceil($total_pages); # 19/5 = 3.8 ~=~ 4
for($i = 1; $i <= $total_pages; ++$i)
{
echo "<a href='?page=$i'>$i</a> ";
}
קיבלנו את כמות השורות במסד (19)
חילקנו בכמות השורות שיש להציג בכל עמוד (5)
קיבלנו שסה"כ יהיה לנו 3.8 עמודים. לאחר עיגול 4 עמודים
והדפסנו אליהם קישורים.
זהו זה, זוהי כל החלוקה לעמודים.
בסה"כ pagination כפי שקוראים אותה באנגלית היא פעולה פשוטה שמתבססת על פקודה אחת בלבד. מעכשיו לא תהיה לכם בעיה להציג למתשמש טבלאות ועמודים ערוכים ומפוצלים ותוכלו לשחק עם עמודים כפי שתרצו.
תגובות לכתבה:
מדריך מעולה !,אבל לא הבנתי כל כך למה זה משמש?,אם תוכל להסביר לי את זה יותר בבירור ולתת לי דוגמאות אני יותר מאשמח! :)
הדבר משמש להצגת נתונים בדפים שונים.
לדוגמה בבלוג הזה יש כמה עשרות כתבות ופרסומים על php
לא כולם מופיעים בעמוד הראשי. בעמוד הראשי מופיעים רק 15
הפרסומים האחרונים. השאר נמצאים בעמוד 2.
נניח שיש באתר 100 פרסומים.
כשאתה גולש ל phpguide.co.il/index.php אני מראה לך את הפרסומים 0 עד 15,
כשאתה גולש ל phpguide.co.il/index.php?page=2 אתה רואה את פרסומים 16 עד 30,
index.php?page=3 אתה רואה 31 עד 45
ולא את כל ה-45 בבת אחת בעמוד הראשי.
תודה אבל אני כבר יודע איך עושים בכל מיקרה מדריך מעווולה!
קוראים לזה pagination.
שלום לך אלכס,
מדריך מעולה רק ברצוני לשאול שאלה אחת :
האם תוכל לעשות את זה במדריך וידיאו?
איך עושים שזה יציג 5 עמודים ואז זה יעשה נקודות עד העמוד האחרון?
לדוגמא:
1,2,3,4,5..30
אתה יכול לקחת את מספר השורות.
לחלק אותם ב 5
ואז לקבל את מספר העמודים ולעשות ללואה
תודה על המדריך.
אך יש לי בעיה, משום מה הוא מכפיל לי את כל השורות במסדר ב5..לא יודע למה
תוכל למלא את טופס השאלה בצירוף קוד בעמוד הראשי ונסמך לעזור. בלי לראות את הקוד שלך אין לנו איך לעזור ותגובות לכתבה זה גם לא המקום :)
מדריך מצויין! ממש עזר לי, תודה :)!
מדריך מצוין! עזרת לי מאוד! :)
וואוו תודה מדריך מעולה
רק יש אפשרות לעשות הגבלה לדוגמא של תמונות שיראו בדף
לדוגמא יש 13 תמונות אז בעמוד index,php?page=0 יהיה 10 תמונות
וב index.php?page=2 זה יציג 3 תמונות איך עושים את זה?